package Util;

/**
 * Esta clase sirve de utilizades. Por ahora solamente lee desde teclado.
 * @author Jesús Fernández 18/03/2011
 * @version 1.0
 */
import java.io.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Teclado {

    /**
     * Este método sirve para leer por teclado un dato de tipo String (cadena), como es un metodo privado,
     * no se puede llamar desde otra clase, asi que habra que llamar a los metodos publicos definidos a continuación.
     * @return, Devuelve un String y luego realiza la conversion de casting desde donde se llama.
     */
    private static String leeTeclado(){
        String textotmp = "";
        try{
            //Obtencion del objeto reader
            InputStreamReader conv = new InputStreamReader(System.in);
            //Obtencion del BufferredREader
            BufferedReader entrada = new BufferedReader(conv);
            //System.out.println("Introduzca "+tipo_dato+": ");
            textotmp = entrada.readLine();
        }catch (IOException e){
            System.out.println("Error en la entrada de datos: \n"+e);
        }
        //System.out.println(texto);
        return textotmp;
    }

    /**
     * Este metodo sirve para leer por teclado datos de tipo int (entero). En la lamada no se le pasa ningun valor,
     * El dato que devuelve es de tipo entero. Realiza una llamada al metodo privado leeteclado().
     * Hace una conversion de casting, para convertir de String (cadena) a int.
     * @return, Devuelve el dato de tipo entero que se solicita por teclado.
     */
    public static int leeEntero(){
        // llama a leeteclado y devuelve lo que devuelve este pero convertido.
        return Integer.parseInt(leeTeclado());
    }

    /**
     * Este metodo sirve para leer por teclado datos de tipo float (decimales). En la lamada no se le pasa ningun valor,
     * El dato que devuelve es un numero con decimales. Realiza una llamada al metodo privado leeteclado().
     * Hace una conversion de casting, para convertir de String (cadena) a float.
     * @return, Devuelve el dato de tipo float que se solicita por teclado.
     */
    public static float leedatoFloat(){
        // llama a leeteclado y devuelve lo que devuelve este pero convertido.
        return Float.parseFloat(leeTeclado());
    }

    /**
     * Este metodo sirve para leer por teclado datos de tipo double (decimales). En la lamada no se le pasa ningun valor,
     * El dato que devuelve es un numero con decimales. Realiza una llamada al metodo privado leeteclado().
     * Hace una conversion de casting, para convertir de String (cadena) a double.
     * @return, Devuelve el dato de tipo double que se solicita por teclado.
     */
    public static double leedatoDouble(){
        // llama a leeteclado y devuelve lo que devuelve este pero convertido.
        return Double.parseDouble(leeTeclado());
    }

    /**
     * Este metodo sirve para leer por teclado datos de tipo String (Cadena). En la lamada no se le pasa ningun valor,
     * El dato que devuelve es de tipo String y devuelve una cadena de caracteres.
     * Realiza una llamada al metodo privado leeteclado().
     * @return, Devuelve el dato de tipo String que se solicita por teclado.
     */
    public static String leeTexto(){
        // llama a leeteclado y devuelve lo que devuelve este pero convertido.
        return leeTeclado();
    }

    public static Date LeeFecha() throws ParseException{
        DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        Date valorDevuelto = null;
        boolean encontrado=false;
        do
        {
        try
        {
            valorDevuelto = df.parse(leeTeclado());
            encontrado=true;
        }
        catch(ParseException e)
        {
            System.out.println("Introduzca la fecha en dígitos numéricos con el siguiente formato: dd/mm/aaaa");
        }

        }while(!encontrado);
        return valorDevuelto;
    }
}
